部分型 (subtype)
上位型 (supertype)と対になる概念
Is-a関係
定義 ref /mrsekut-book-4274069117/166 (第15章 部分型付け)
型Sの任意の項が、型Tの項が期待されている文脈で安全に使用可能であることを、SはTの部分型であるという
この時、S <: Tと書く
部分型 <: 上位型
関数の部分型関係
例
code:ts
const x = { x: 1, y: 'hoge' };
const f = (arg: { x: number }) => {
return arg.x;
};
f(x);
これはTypeScriptに慣れていたら当たり前に見えるが、
もっと融通の効かない型システムだと、{x:number,y:string}と{x:number}は別の型だ!エラーにする!となる
しかし、実際はこの操作は常に安全であるし、それも引数の型情報のみで判断できる
つまり、関数のbodyを見なくても安全であると判断できる
そこで、この融通を効かせるために、部分型のようなものが要請される
Record型における部分型
Record型はfieldの数が多い方が部分型になる
例えば以下のような2つの型があるとき
code:ts
type S = {
foo: string;
bar: number;
}
type T = {
foo: string;
}
S <: Tという関係である
つまり、SはTの部分型である
つまり、Sは常にTに置き換え可能である
propertyの数が大きければ大きいほど、その集合に属する値の数が減る
これは、Width Subtyping Ruleという規則で表される
recordのネストした部分についての規則は、Depth Subtyping Rule
Aは、A | Bの部分型で、A & BはAの部分型というのが非直感的でおもしろいmrsekut.icon
つまり、A & B <: A <: A | Bとなる
関連
包摂規則 T-SUB
参考
/mrsekut-book-4274069117/166 (第15章 部分型付け)